// Loesung_von_Aufgabe_2.5.7_3_schiefe_Ebene

// Vektorzerlegung für einen Körper auf der schiefen Ebene

float wr; // Winkel im Bogenmaß
float w; // Winkel in Grad
float x = 300;
float yE = 0; // Startwert für den höchsten Punkt der Ebene
float yK; // Mittelpunkt des Körpers
float FgB; // Betrag der Gewichtskraft
float FhB; // Betrag der Hangabtriebskraft
float FnB; // Betrag der Normalkraft

void setup()
{
  size(400, 400);
}

void draw()
{
  background(230);
  translate(200, 220); // Erste Verschiebung des Koordinatensystems

  yE = yE - 1; // Die rechte Seite der schiefen Ebene wird bei jedem Durchlauf von void draw() um ein Pixel vergrößert
  wr = atan(yE/x); // Berechnung des Steigungswinkels der schiefen Ebene im Bogenmaß
  yK = x/2*tan(wr); // Berechnung des Kugelmittelpunktes
  w = -degrees(wr); /* Umwandlung des Winkels vom Bogenmaß in Grad. Weil bei Processing die positive y-Achse
   nach unten zeigt, steht vor degrees ein Minuszeichen. So erhält man einen positiven Winkelwert */

  PVector Fg = new PVector (0, 200, 0); // Gewichtskraft
  PVector Fn = PVector.mult(Fg, cos(radians(w))); // Normalkraft Fn, die noch in Richtung von Fg zeigt
  Fn.rotate(radians(-w)); // Drehung von Fn um den Winkel w nach rechts
  PVector Fh = PVector.mult(Fg, sin(radians(w))); // Hangabtriebskraft Fh, die noch in Richtung von Fg zeigt
  Fh.rotate(radians(90-w)); // Drehung von Fh um 90°-w nach links

  // schiefe Ebene
  stroke(0);
  strokeWeight(2);
  line(-150, 0, 150, 0);
  line(150, 0, 150, yE);
  line(-150, 0, 150, yE);

  translate(0, yK); // Zweite Verschiebung des Koordinatensystems. Das Koordinatensystem wird nun in den Mittelpunkt des Körpers verschoben
  // Koordinatenkreuz
  stroke(255);
  strokeWeight(4);
  line(0, -200, 0, 300);
  line(-200, 0, 200, 0);

  // Hilfslinien
  stroke(0);
  strokeWeight(1);
  line(Fh.x, Fh.y, Fg.x, Fg.y);
  line(Fn.x, Fn.y, Fg.x, Fg.y);

  // Vektoren werden gezeichnet
  strokeWeight(3);
  stroke(255, 0, 0);
  line(0, 0, Fg.x, Fg.y);
  stroke(0, 255, 0);
  line(0, 0, Fn.x, Fn.y);
  stroke(0, 0, 255);
  line(0, 0, Fh.x, Fh.y);

  noStroke();
  fill(255, 0, 0);
  ellipse(Fg.x, Fg.y, 10, 10);
  fill(0, 255, 0);
  ellipse(Fn.x, Fn.y, 10, 10);
  fill(0, 0, 255);
  ellipse(Fh.x, Fh.y, 10, 10);

  if (w >= 30)
  {
    noLoop();
  }
  // schwarzer Körper auf der schiefen Ebene
  stroke(0);
  strokeWeight(15);
  point(0, 0);

  FgB =Fg.mag(); // Betrag von Fg
  FhB = Fh.mag(); // Betrag von Fh
  FnB = Fn.mag(); // Betrag von Fn

  println("w = " +w, "  FgB = " +FgB, "  FhB = " +FhB, "  FnB = " +FnB);
}